// excerpts from http://code.google.com/p/muduo/
//
// Use of this source code is governed by a BSD-style license
// that can be found in the License file.
//
// Author: Shuo Chen (chenshuo at chenshuo dot com)

#pragma once

#include "thread/Thread.h"
#include "noncopyable.h"

#include <unistd.h>

namespace learnmuduo
{
class EventLoop : public noncopyable { // 因为基类把拷贝构造和拷贝赋值运算符声明为 `deleted`，派生类复制时需要先复制基类子对象而被编译器禁止，因此通过继承即可禁止复制。
public:
  EventLoop();
  ~EventLoop();

  void loop(); // 启动事件循环

  void assertInLoopThread() {
    if (!isInLoopThread()) {
      abortNotInLoopThread();
    }
  }

  bool isInLoopThread() const { return threadId_ == muduo::CurrentThread::tid(); } // 判断是否在所属线程

  static EventLoop* getEventLoopOfCurrentThread();

private:
  void abortNotInLoopThread(); // 非法线程访问时处理

  bool looping_; /* atomic */ // 标记是否正在循环
  const pid_t threadId_; // threadId_：记录该 EventLoop 所属线程的 ID，用于在运行期校验调用是否发生在正确的线程上（例如 loop() 前的 assertInLoopThread 检查）。
};
} // namespace learnmuduo
